summaryrefslogtreecommitdiffstats
path: root/src/common/wall_clock.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/wall_clock.h')
-rw-r--r--src/common/wall_clock.h20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/common/wall_clock.h b/src/common/wall_clock.h
index 56c18ca25..fcfdd637c 100644
--- a/src/common/wall_clock.h
+++ b/src/common/wall_clock.h
@@ -13,7 +13,8 @@ namespace Common {
class WallClock {
public:
- static constexpr u64 CNTFRQ = 19'200'000; // CNTPCT_EL0 Frequency = 19.2 MHz
+ static constexpr u64 CNTFRQ = 19'200'000; // CNTPCT_EL0 Frequency = 19.2 MHz
+ static constexpr u64 GPUTickFreq = 614'400'000; // GM20B GPU Tick Frequency = 614.4 MHz
virtual ~WallClock() = default;
@@ -29,6 +30,9 @@ public:
/// @returns The guest CNTPCT ticks since the construction of this clock.
virtual u64 GetCNTPCT() const = 0;
+ /// @returns The guest GPU ticks since the construction of this clock.
+ virtual u64 GetGPUTick() const = 0;
+
/// @returns The raw host timer ticks since an indeterminate epoch.
virtual u64 GetHostTicksNow() const = 0;
@@ -46,6 +50,10 @@ public:
return us * UsToCNTPCTRatio::num / UsToCNTPCTRatio::den;
}
+ static inline u64 NSToGPUTick(u64 ns) {
+ return ns * NsToGPUTickRatio::num / NsToGPUTickRatio::den;
+ }
+
static inline u64 CNTPCTToNS(u64 cntpct) {
return cntpct * NsToCNTPCTRatio::den / NsToCNTPCTRatio::num;
}
@@ -54,6 +62,14 @@ public:
return cntpct * UsToCNTPCTRatio::den / UsToCNTPCTRatio::num;
}
+ static inline u64 GPUTickToNS(u64 gpu_tick) {
+ return gpu_tick * NsToGPUTickRatio::den / NsToGPUTickRatio::num;
+ }
+
+ static inline u64 CNTPCTToGPUTick(u64 cntpct) {
+ return cntpct * CNTPCTToGPUTickRatio::num / CNTPCTToGPUTickRatio::den;
+ }
+
protected:
using NsRatio = std::nano;
using UsRatio = std::micro;
@@ -63,6 +79,8 @@ protected:
using NsToMsRatio = std::ratio_divide<std::nano, std::milli>;
using NsToCNTPCTRatio = std::ratio<CNTFRQ, std::nano::den>;
using UsToCNTPCTRatio = std::ratio<CNTFRQ, std::micro::den>;
+ using NsToGPUTickRatio = std::ratio<GPUTickFreq, std::nano::den>;
+ using CNTPCTToGPUTickRatio = std::ratio<GPUTickFreq, CNTFRQ>;
};
std::unique_ptr<WallClock> CreateOptimalClock();